﻿#pragma once
#ifndef _NET_CHANNEL_HANDEL_
#define _NET_CHANNEL_HANDEL_

#include <iostream>
#include "cocos2d.h"
//
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

#else
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <stdlib.h>
#include <unistd.h>
#endif
#include "ByteArray.h"
using namespace cocos2d;
#define RECVMAXLEN                                2048

#include "network/HttpClient.h"

enum class NetChannel
{
	NET_HTTP_CHANNEL,
	NET_SOCKET_CHANNEL
};

#define NET_CALLBACK(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
typedef std::function<void(ByteArray*)> NetCallback;

/**
* @author soells
* @E-mail:soells@foxmail.com
* @time 创建时间：2015-04-05 14:54:13
* @info 程序的简单说明
*	修改(2015年4月15日 15:55:54) 由于httpClient 内部回调线程依托于UI主线程，http模式下摒弃自建UI主线程
*	网络分发定时器。
*/
class NetChannelHandel :public CCObject
{
public:
	NetChannelHandel();
	~NetChannelHandel();
	static NetChannelHandel* getInstance();
	//设置网络模式
	void setModel(NetChannel net);
	//获取网络模式
	NetChannel getModel();
	//设置地址端口
	void setAddr(std::string host, unsigned short port);//设置地址
	//线程启动
	void startThread();
	//销毁
	void destroyInstance();
private:
	int m_Socket;
	//socket request
	bool onRequest();
	//线程
	static void* networkThread(void* args);
	//发送数据
	bool sendMessage();
	//网络分发
	void netWorkOperation();
	//http request
	void onHttpRequest(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response);
	//数据封包操作
	bool warp(ByteArray* data);
	//清理
	void dispose();
public:
	//数据发送
	void sendMsg(ByteArray* data);
	//注册网络回掉函数
	void addEventListeners(unsigned short commandID, NetCallback _callback);
	//删除网络回掉函数
	void removeEventListeners(unsigned short commandID);
};
#endif
